/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package compumundohipermegared;

import clasesJXTA.AdministradorJXTA;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Serializable;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.jxta.id.IDFactory;
import net.jxta.pipe.PipeID;
import net.jxta.pipe.PipeService;
import net.jxta.socket.JxtaMulticastSocket;
import net.jxta.socket.JxtaServerSocket;
import net.jxta.socket.JxtaSocket;

/**
 *
 * @author asistente
 */
public class Compartidor extends Thread implements Serializable{
     /**
     * Indicador de versión para la serialización
     */
    private static final long serialVersionUID = 200L;
    
    // acá va toda la declaración de lo de jxta
    /**
     * este arrylist guarda las fotos que están en el equipo
     * se usa para responder a las consultas
     * debe ser lo mismo que tiene la clase CompuMundoHipermegaRed
     */
    private ArrayList<Foto> fotosEnMiEquipo;
    
    /**
     * 
     */
    private AdministradorJXTA administradorJXTA;
    
    /**
     * server socket de jxta
     */
    private JxtaServerSocket jxtaServerSocket;
    
    private JxtaMulticastSocket jxtaMulticastSocket;
    
    private Compumundohipermegared compumundohipermegared;
    
    /**
     * construye la clase con las fotos del equipo
     * tiene que ser el mismo apuntador que el de la clase 
     * compumundohipermegared
     * @param fotosEnMiEquipo 
     */
    public Compartidor( ArrayList<Foto> fotosEnMiEquipo, AdministradorJXTA adminJxta , Compumundohipermegared padre) throws IOException
    {
        this.fotosEnMiEquipo = fotosEnMiEquipo;
        compumundohipermegared = padre;
        
        administradorJXTA = adminJxta;
        jxtaServerSocket = new JxtaServerSocket( administradorJXTA.getNetPeerGroup(), administradorJXTA.getPipeAdv( ) );
        jxtaServerSocket.setSoTimeout( 0 );      
        jxtaMulticastSocket = new JxtaMulticastSocket(administradorJXTA.getNetPeerGroup( ), administradorJXTA.getPropagatePipeAdv( ) );
        InetAddress group = InetAddress.getByName(Compumundohipermegared.DIRECCION_MULTICAST);
            jxtaMulticastSocket.joinGroup(group);
            jxtaMulticastSocket.setBroadcast(true);
            jxtaMulticastSocket.setSoTimeout(0);
            
            System.out.println(group.toString());
        EnviadorFotoMasParecida envMasParecida = new EnviadorFotoMasParecida( jxtaMulticastSocket, fotosEnMiEquipo, this );
                envMasParecida.start( );
        
                
    }
    
    public void acutalizarFotosEnMiEquipo(ArrayList<Foto> fotosNuevas){
        fotosEnMiEquipo = fotosNuevas;
    }
    
    /**
     * este metodo escucha advertisements bucando fotos y responde según lo que tenga 
     */
    public void escucharYResponderAdvertisements(){
        
    }
    /**
     * envía una foto al destinatario 
     * toca revisar cómo se hace esto con jxta
     * @param destinatario 
     */
    public void enviarFoto(String destinatario){
        
    }
    /**
     * Metodo encargado de escuchar por el serverSocket por conexiones
     */
    public void run( )
    {
        // siempre está esperando conexiones
        while( true )
        {
            try
            {
                System.out.println("Esperando Conexiones");
                Socket socketCliente = jxtaServerSocket.accept();
                
                System.out.println("Acabo de recibir una conexión de: \n"+ socketCliente.toString());
                PrintWriter out = new PrintWriter( socketCliente.getOutputStream( ), true );
                BufferedReader in = new BufferedReader( new InputStreamReader( socketCliente.getInputStream( ) ) );
                OutputStream outputStream = socketCliente.getOutputStream();
                InputStream inputStream = socketCliente.getInputStream();
                
                EnviadorArchivos env = new EnviadorArchivos(out, in, outputStream, inputStream, fotosEnMiEquipo, compumundohipermegared );
                env.start( );
                
                
                System.out.println( "Paso 4" );
            } 
            catch( IOException ex )
            {
                System.out.println("Hubo un error al aceptar una conexion de otro peer");
            }
        }
    }
    /**
     * bloquea al sistema porque alguien está buscando por foto mas parecida
     */
    void bloquearSistema() {
        compumundohipermegared.bloquearSistema();
    }

    void desbloquear( )
    {
        compumundohipermegared.desbloquear( );
    }

    String darNombreUsuario() {
        return compumundohipermegared.getNombreUsuario();
    }
    
    public void asignarDatosBuscarFotoMasParecida( int anchoImagen, int altoImagen, String idfoto )
    {
        compumundohipermegared.asignarDatosBuscarFotoMasParecida(anchoImagen, altoImagen, idfoto);
    }

    void envioFotoMasParecida() 
    {
        compumundohipermegared.envioFotoMasParecida( );
    }

    boolean estaBuscandoFotoMasParecida( )
    {
        return compumundohipermegared.estaBuscandoFotoMasParecida( );
    }
    
    int darAncho( )
    {
        return compumundohipermegared.darAncho( );
    }

    int darAlto( )
    {
        return compumundohipermegared.darAlto( );
    }

    String darIdFoto( )
    {
        return compumundohipermegared.darIdFoto( );
    }
}
